import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import { useUserStore } from './stores/user'
import { useLayoutStore } from './stores/layout'
import { setupDynamicRoutes } from './utils/dynamicRoutes'
import { initThemeFromUser } from '@/utils/theme'
import { initFontSize } from '@/utils/fontSize'

// 权限判断函数
import isAuth from '@/common/isAuth'

// Element Plus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// Element Plus 中文语言包
import zhCn from 'element-plus/es/locale/lang/zh-cn'



const app = createApp(App)

app.use(createPinia())
app.use(ElementPlus, {
  locale: zhCn,
})
app.use(router)

// 挂载全局权限判断方法
app.config.globalProperties.$isAuth = isAuth

// 恢复用户登录状态和动态路由
const initializeApp = async () => {
  try {
    const userStore = useUserStore()
    const layoutStore = useLayoutStore()

    // 恢复用户信息（已包含错误处理）
    userStore.restoreUserInfo()
    layoutStore.restoreLayoutSettings()

    // 初始化字体大小系统
    initFontSize()

    // 如果用户已登录，设置动态路由和主题
    if (userStore.isLoggedIn && userStore.menuList && userStore.menuList.length > 0) {
      setupDynamicRoutes(userStore.menuList)

      // 初始化用户主题
      if (userStore.employeeInfo && userStore.employeeInfo.style) {
        initThemeFromUser(userStore.employeeInfo.style)
      }
    }

    // 等待路由准备完成后再挂载应用
    await router.isReady()
    app.mount('#app')
  } catch (error) {
    console.error('应用初始化失败:', error)

    // 如果是解密相关错误，执行完整清理
    if (error.message && (error.message.includes('Malformed UTF-8') || error.message.includes('解密失败'))) {
      console.warn('检测到解密错误，执行完整清理...')
      try {
        const { useUserStore } = await import('@/stores/user')
        const userStore = useUserStore()
        userStore.handleDecryptionFailure()
        return // 不再继续挂载，因为会跳转到登录页
      } catch (cleanupError) {
        console.error('清理失败，强制刷新页面:', cleanupError)
        window.location.reload()
        return
      }
    }

    // 其他错误，尝试正常挂载应用
    try {
      await router.isReady()
      app.mount('#app')
    } catch (mountError) {
      console.error('应用挂载失败:', mountError)
    }
  }
}

// 初始化应用
initializeApp()
